/**
 * 数组筛选
 * @author xiaoxujs
 */

// 判断是否符合条件
const fuzzyMatch = (source: string, target: string): boolean => {
    // 将目标字符串转换为正则表达式，允许字符之间有任意字符
    const regex = new RegExp(target.split('').join('.*'), 'i');
    return regex.test(source);
};

/**
 * 处理数组筛选
 * @param listData 待筛选的数组
 * @param obj 筛选条件对象
 * @returns 筛选后的数组
 */
export const handleArrayFiltering = <T extends Record<string, any>, U extends Record<string, any>>(
    listData: T[],
    obj: U
): T[] => {
    return listData.filter((element) => {
        // 遍历筛选条件对象的键
        for (const key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key)) {
                const targetValue = obj[key]; // 获取筛选条件值
                const sourceValue = element[key]; // 获取数组元素的值

                // 如果筛选条件值是字符串，且数组元素的值也是字符串，则进行模糊匹配
                if (typeof targetValue === 'string' && typeof sourceValue === 'string') {
                    if (!fuzzyMatch(sourceValue, targetValue)) {
                        return false; // 如果不符合条件，则排除该元素
                    }
                }
            }
        }
        return true; // 如果所有条件都符合，则保留该元素
    });
};